package com.jiajia.study.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author zjiajia
 * @date 2024/7/14 21:30
 */


@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                /**
                 * 放行的资源需要放在，anyRequest() 的前面才可以，否则就会报错
                 */
                .mvcMatchers("/index").permitAll()
                /**
                 * 除了前面放行的资源，都需要进行认证
                 */
                .anyRequest().authenticated()
                .and()
                /**
                 * 认证的方式是 ： formLogin 的方式
                 *
                 * 这里可以看一下源码 ：
                 *
                 * FormLoginConfigurer  -->
                 * UsernamePasswordAuthenticationFilter#attemptAuthentication
                 *
                 * 需要满足四个条件 :
                 *  1. 请求路径是 "/login/
                 *  2. 请求方式 post
                 *  3. username 的key  username
                 *  4. password 的key  password
                 */
                .formLogin()
                /**
                 * 自定义了 loginPage 之后，必须要制定自定义的 login (loginProcessingUrl) 的路径
                 */
                .loginPage("/login.html")
                .loginProcessingUrl("/doLogin")
                /**
                 * 自定义请求的 用户名和密码的 key
                 */
                .usernameParameter("uname")
                .passwordParameter("passwd")
                /**
                 * 请求成功之后跳转路径 ：
                 * forward :  地址不变，一次请求
                 *
                 * 始终跳到设置的地址，不会跳转之前请求的地址
                 */
//                .successForwardUrl("/index")
                /**
                 * 默认成功跳转路径：
                 *      redirect : 地址会变，两次请求
                 *      这里是重定向
                 *
                 * 这里会记录之前请求的资源：
                 *      1. 如果一开始就是请求的登录，那么就跳到默认的路径
                 *      2. 如果一开始请求了受限资源，那么会跳到之前的请求资源
                 *
                 * 这里还可以设置第二个参数，为 true 的话，就会总是调到设置的地址
                 */
                .defaultSuccessUrl("/index")
                .successHandler(new MyAuthenticationSuccessHandler())
                /**
                 * 可以断点调试异常放在那里了 --> 放在了 session 中
                 *
                 * 需要判断是重定向还是forward ，放的 session 域不同，key 不同
                 *
                 * request 作用域
                 */
                .failureForwardUrl("index")
                /**
                 * redirect :
                 *      session 作用域
                 */
                .failureUrl("index")
//                .failureHandler()

                .and().csrf().disable()
        ;
    }
}
